package com.dtx.observer;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * NumberGenerator类是用于生成数值的抽象类。生成数值的方法(execute)方法和获取数值的方法(getNumber方法)都是抽象方法,需要子类去实现。
 * observers字段中保存有观察NumberGenerator的Observer们。
 * addObserver方法用于注册Observer,而deleteObserver方法用于删除Observer，
 * notifyObserver方法会向所有的Observer发送通知,告诉它们"我生成的数值发生了变化,请更新显示内容"。该方法会调用每个Observer的update方法。
 */
public abstract class NumberGenerator {

    /**
     * 保存Observer们
     */
    private List<Observer> observers = new ArrayList<>();

    /**
     * 注册Observer
     */
    public void addObserver(Observer observer){
        observers.add(observer);
    }

    /**
     * 删除Observer
     * @param observer
     */
    public void deleteObserver(Observer observer){
        observers.remove(observer);
    }

    public void notifyObservers(){
        Iterator<Observer> iterator = observers.iterator();
        while (iterator.hasNext()) {
            Observer observer = iterator.next();
            observer.update(this);
        }

    }

    /**
     * 获取数值
     * @return
     */
    public abstract Integer getNumber();

    /**
     * 生成数值
     */
    public abstract void execute();
}
